package com.subfg.common.entity.config.pay;


import com.subfg.common.entity.common.CommonModel;
import com.subfg.common.util.auth.AesUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.Serializable;

@Data
@ApiModel(value = "支付宝支付配置信息")
public class ConfigPayAliModel extends CommonModel implements Serializable {
    @ApiModelProperty(value = "类型  1: 密钥模式      2:证书模式")
    private Integer type;
    @ApiModelProperty(value = "应用id")
    private String appId;
    @ApiModelProperty(value = "支付宝私钥")
    private String privateKey;
    @ApiModelProperty(value = "密钥模式, 支付宝公钥")
    private String alipayPublicKey;

    @ApiModelProperty(value = "证书模式, 支付宝公钥")
    private String alipayPublicCertContent;
    @ApiModelProperty(value = "证书模式, 商户公钥")
    private String appCertContent;
    @ApiModelProperty(value = "证书模式, 根证书内容")
    private String rootCertContent;

    @ApiModelProperty(value = "支付宝网关")
    private String gateway;



    private static Logger log = LoggerFactory.getLogger(ConfigPayAliModel.class);




    /**
     *  解密支付数据
     * @param configPayAli   从数据库取出来的支付配置数据
     * @return
     */
    public static ConfigPayAliModel decodeAlipayConfigInfo(ConfigPayAliModel configPayAli) {
        try {
            configPayAli.setPrivateKey(AesUtil.aesDecrypt(configPayAli.getPrivateKey()));
            configPayAli.setAppId(AesUtil.aesDecrypt(configPayAli.getAppId()));
            // 判断是证书 模式 还是 密钥模式
            if (configPayAli.getType() == 1) {
                log.info("支付宝目前的配置模式是密钥模式");
                configPayAli.setAlipayPublicKey(AesUtil.aesDecrypt(configPayAli.alipayPublicKey));
            } else if (configPayAli.getType() == 2){
                log.info("支付宝目前配置模式是证书模式");
                configPayAli.setRootCertContent(AesUtil.aesDecrypt(configPayAli.getRootCertContent()));
                configPayAli.setAlipayPublicCertContent(AesUtil.aesDecrypt(configPayAli.getAlipayPublicCertContent()));
                configPayAli.setAppCertContent(AesUtil.aesDecrypt(configPayAli.getAppCertContent()));
            }
            return configPayAli;
        } catch (Exception e) {
            log.error("严重错误!!! 支付宝解密失败!!! 这可能导致支付宝支付无法使用!!!");
            log.error("详细错误如下: {}", e);
            return null;
        }
    }

    /**
     * 加密支付宝支付数据
     * @param configPayAli 前端修改的支付宝支付数据
     * @return
     */
    public static ConfigPayAliModel encryptAliConfigInfo(ConfigPayAliModel configPayAli) {
        if (configPayAli != null) {
            configPayAli.setPrivateKey(AesUtil.aesEncrypt(configPayAli.getPrivateKey()));
            configPayAli.setAppId(AesUtil.aesEncrypt(configPayAli.getAppId()));
            // 判断是证书 模式 还是 密钥模式
            if (configPayAli.getType() == 1) {
                configPayAli.setAlipayPublicKey(AesUtil.aesEncrypt(configPayAli.alipayPublicKey));
            } else if (configPayAli.getType() == 2){
                configPayAli.setRootCertContent(AesUtil.aesEncrypt(configPayAli.getRootCertContent()));
                configPayAli.setAlipayPublicCertContent(AesUtil.aesEncrypt(configPayAli.getAlipayPublicCertContent()));
                configPayAli.setAppCertContent(AesUtil.aesEncrypt(configPayAli.getAppCertContent()));
            }
            return configPayAli;
        }
        return null;
    }
}
